\documentclass[10pt,a4paper]{article}
\usepackage[spanish]{babel} 
\usepackage{amsmath}
\usepackage{amsfonts}
\usepackage{amssymb}
\usepackage{graphicx}
\usepackage{listings}
\usepackage{a4wide}
\usepackage{ucs}
\usepackage{url}
\usepackage[utf8x]{inputenc}
\usepackage{afterpage}
\author{Ezequiel Velez, Andrés Peralta}
\title{Documento de requerimientos}
\begin{document}

\begin{center}
\begin{Large}\textbf{Documento de Especificación de Requerimientos:\underline{}}\end{Large}\\

ASO (Sistema de Optimización de Terapias Antirretrovirales)\\
\end{center}
Andres Peralta\\
Ezequiel Velez\\

\section{Introducción}
	\subsection{Propósito}
	El presente documento define las especificaciones propuestas por el Dr.Daniel Rabinovich y Daniel Gutson basados en el trabajo presentado por ambos y que establecen la primera etapa de este proyecto de trabajo final.
    En este documento especificamos los requerimientos funcionales del sistema, as como detalles 
    del problema, casos de uso, y una pequeña descripción de la interfaz gráfica además de ser una gua inicial para la etapa de diseño. Se utilizar también como parte de la validación final del proyecto.
    Este documento sigue la estructura del estándar IEEE STD 830-1998 para documentos de especificación de requerimientos.

    \subsection{Alcance:}
    Queremos lograr con esta especificación una base sólida para un sistema que comprenda las siguientes características:

	\begin{itemize}
	\item Abarcar en su totalidad los requerimientos del problema.
	\item Constituir un sistema base o core que pueda ser reutilizado y extendido en otros proyectos.
	\item Que sea de fácil utilización por parte de los usuarios finales.
	\item Que proponga un buen uso de las variantes algorítmicas para su mejor desempeño.
	\item Que posea una documentación clara y concisa.
	\item Proveer un Build System para crear plugins que extiendan la funcionalidad del sistema.
	\item Lograr un código estructurado y bien escrito.
	\end{itemize}

	\subsection{Definiciones, Acrónimos y Abreviaturas.}
	\begin{itemize}
	\item Virus: Es una entidad biológica que para reproducirse necesita de una célula huésped.	
	\item V.I.H: Virus de Inmunodeficiencia Humana.
	\item Alineamiento: cuando se recibe el archivo FASTA de un virus este suele estar incompleto o con errores. Luego, para identificar el tipo de cepa de debe alinear la secuencia del archivo FASTA con secuencias canónicas y verificar concordancias. 
	\item HXB2  HIV-1 y HIV-2: Dos tipos de Virus de Inmunodeficiencia Humana (VIH) infectan a los humanos: VIH-1 y VIH-2. El VIH-1 es el más virulento y se transmite fácilmente, y es la fuente de la mayoría de las infecciones por el VIH en todo el mundo, el VIH-2 est muy concentrado en el oeste de frica
	\item Formato FASTA:el formato FASTA es un formato de fichero informático basado en texto, utilizado para representar secuencias de cidos nucleicos y en el que los pares de bases o los aminoácidos se representan usando códigos de una única letra.
	\item Antirretroviral: Medicamento utilizado para el tratamiento de infecciones virales.
	\item Mutante: individuo, organismo o nuevo carácter genético resultado de una instancia de mutación.
	\item ADN:es un tipo de ácido nucleico, una macromolécula que forma parte de todas las células.
	\item ARN: es un ácido nucleico formado por una cadena de ribonucleótidos.
	\item Proteína: son macromoléculas formadas por cadenas lineales de aminoácidos.
	\item Transcriptasa reversa: es una enzima de tipo ADN-polimerasa, que tiene como función sintetizar ADN de doble cadena utilizando como molde ARN monocatenario, es decir, catalizar la retrotranscripción o transcripción inversa.
	\item Proteasa: son enzimas que rompen los enlaces peptdicos de las proteínas.
	\item Nucleótido: son moléculas orgánicas formadas por la unión covalente de un monosacarido de cinco carbonos (pentosa), una base nitrogenada y un grupo fosfato.
	\item Python: Lenguaje de Programación Interpretado de simple utilización.	
	\end{itemize}
	

	\subsection{Referencias:}
	\begin{enumerate}
	\item IAS (International AIDS Society)- http://www.iasociety.org/
	\item IAS Resistance 2008 Reference - http://www.iasusa.org/resistance\_mutations/mutations\_figures.pdf
	\item FASTA Format: http://www.ncbi.nlm.nih.gov/blast/fasta.shtml
	\item HIV-1(HXB2) complete reference - http://www.ncbi.nlm.nih.gov/nuccore/1906382.
	\item Heterogeneidad en la distancia genética a resistencia en secuencias del HIV en pacientes vírgenes de tratamiento (Rabinovich, Gutson,et al).
	\item Genetic Code Conversion Table - http://www.ncbi.nlm.nih.gov/Taxonomy/Utils/wprintgc.cgi
	\item Geno2Pheno Application - www.geno2pheno.org
	\item Python Programming Language - http://www.python.org
	\item FXP (FuDePAN XML Parser) - http://code.google.com/p/fx-parser/
	\item An Integrated approach to Software Engineering - Pankaj Jalote.
	\item IEEE STD 830-1998 - http://ieeexplore.ieee.org/xpl/tocresult.jsp?isNumber=16019
	\item Boost Python: http://www.boost.org/doc/libs/1\_40\_0/libs/python/doc/index.html
	\end{enumerate}    
\newpage

\section{Descripción General}

	\subsection{Perspectivas del sistema.}
	Desarrollaremos un sistema, que a partir de una secuencia de VIH sea capaz de sugerir un listado ordenado de terapias para el tratamiento del paciente. Ademas, el sistema debe ser sumamente adaptable a futuras mejoras. Dicho sistema debe poder evaluar distintas combinaciones de antirretrovirales. 

	\subsection{Funcionalidad.}
	
	\begin{enumerate}
	\item El sistema pretende la funcionalidad de tomar la secuencia ARN de una cepa de virus de VIH determinada por un análisis de sangre efectuado al paciente y generar un listado ordenado de terapias de aplicación de Antirretrovirales que el médico podrá utilizar como guía.
	
    \item El proceso de la acción de los Antirretrovirales.
    Un antirretroviral actúa sobre una parte esencial del virus, en este caso la Proteasa o la Transcriptasa Reversa del virus afectando a una parte esencial en el proceso de replicación de este. Por eso,existen dos tipos de antirretrovirales,uno que afecta a la proteasa (PRO) y otro que ataca la transcriptasa reversa (RT).
    Estos dos tipos estn agrupados en tres clases, uno que inhibe la proteasa (PI)y dos que atacan la RT denominados Inhibidores de RT (NRTI)e Inihibidores de RT no Nuclesicos (NNRTI).
		\begin{enumerate}
        \item Tipos de Antirretrovirales: al momento de escribir este documento existe una variedad de 17 antirretrovirales divididos en las tres clases antes mencionadas, estos datos son proporcionados por la IAS. 
		\item Mutante de un Virus: Cuando un antirretroviral (o una combinación de estos) es aplicado a un virus, este muta para poder escapar a la accin de estos. Estas nuevas mutantes son inmunes a la acción de los antirretrovirales antes aplicados, con lo cual se debe volver al proceso inicial de seleccionar un antirretroviral. De cada aplicación a cada tipo de virus presentamos un listado de las posibles mutantes obtenidas.
		\item Tabla de Mutantes de aplicación de antirretrovirales: nos remitimos a la tabla confeccionada por la IAS para obtener los datos que corresponden de aplicar un antirretroviral a una mutación determinada.
		\end{enumerate}
		
	\item El proceso Computacional:
    	\begin{enumerate}
    	\item El paso inicial: Se deberán completar una serie de Inputs:
    		\begin{itemize}
			\item Un archivo en formato FASTA con la secuencia inicial de la cepa dominante y la secuencia canónica HXB2 (deben estar contenidas en un mismo archivo).
			\item Configurar valores mínimos y máximos para el tamaño de combinación de conjuntos de antirretrovirales a aplicar a la vez.
			\item Posibilidad de seleccionar un plugin que implemente una determinada función (o varias funciones). Para este trabajo tendremos un plugin inicial que ser utilizado por default. Vale aclarar que el plugin debe poseer una función de scoring que servir para la posterior selección de los antirretrovirales y el armado de las terapias.
			\item Establecer los parámetros requeridos por el plugin (el plugin establece una serie de parámetros necesarios de acuerdo a su implementación).
			\end{itemize}   
	 	
		\item Los Pasos de elección (generación de un árbol de terapias): a continuación describimos los pasos del algoritmo de generación de terapias.
    	\begin{enumerate}
    	\item Se toma un nodo(secuencia/mutante del virus) y se obtienen los antirretrovirales aplicables.
    	\item Se generan todos los posibles conjuntos de antirretrovirales con tamaño mínimo N y máximo M (debido a la ineficacia de las mono-terapias).
    	\item Se obtienen las mutantes resultado de la aplicación de los conjuntos de antirretrovirales a la secuencia.
    	\item Continuamos confeccionando el árbol tomando en cuenta dos alternativas para generarlo:
    			\begin{itemize}
    			\item Alternativa 1: se genera un nuevo nodo por cada mutante producida (muy costoso a nivel computacional).
    			\item Alternativa 2: se generan nodos sólo para aquellas mutantes consideradas relevantes por la función de scoring.(No es necesario generar todo el espacio de búsqueda).
    			\end{itemize}
    	\item Se repite el proceso para cada mutante (nodo) generada, hasta que:
    			\begin{itemize}
				\item No se puedan aplicar más antirretrovirales(se llegue a la cepa super-resistente).
				\item Que el algoritmo de búsqueda determine que no es factible continuar esa terapia.
				\end{itemize} 
    	\end{enumerate}			
    	\item Recorrido del árbol generado: cada rama del árbol corresponder a una terapia, con lo cual,debemos recorrer cada una de estas y desarrollar un listado de terapias. Para esta parte es crucial el algoritmo de recorrido del árbol que se utilice.
       	\item Ranking de Terapias: Finalmente ordenamos la lista de terapias (de más recomendable a menos recomendable)que sera utilizada como referencia por el médico.
       	\end{enumerate}
    
    \item Administración de PlugIns: como mencionamos con anterioridad, deseamos proveer la capacidad del sistema de incluir plugins en lenguaje Python para extender la funcionalidad del sistema.
    \item Diagramas: la figura 1 muestra el como sera la idea de generación del árbol en forma teórica, en donde cada nivel impar se aplica una combinación de antirretrovirales (CA1,CA2,CA3) y obtenemos nodos que despliegan las mutantes producidas en los niveles pares (M1\_CA1,etc).En la figura 2 se muestra como se vera el árbol generado en forma aplicada, en donde siempre tenemos que cada arista es la aplicación de una combinación de antirretrovirales con una mutante asociada y cada nodo es la mutante.
    
           	
	\item Diagrama de Flujo de Datos (figura 3):
	Para poder estructurar lo mencionado con anterioridad utilizamos el siguiente diagrama donde se denotan transformadores de información (círculos), flujos de datos (flechas), fuentes de datos (lineas) y el origen y final del recorrido de los datos sin presentar cuestiones referidas a control, decisiones o ciclos.
	
	\begin{figure}
  	\centering
    \includegraphics{Arbol1.jpg}
  	\caption{Árbol Teórico}
	\end{figure}

	\begin{figure}
  	\centering
    \includegraphics{Arbol2.jpg}
  	\caption{Árbol Aplicado} 
	\end{figure}   	
	
	\begin{figure}
  	\centering
    \includegraphics[width=\linewidth]{DFD_2.jpg}
  	\caption{DFD}
	\end{figure}
	
	\end{enumerate}


	\subsection{ Dependencias.}
		\begin{enumerate}
		\item BIOpp: Librera de C++ para el manejo de estructuras biológicas,código genético, entre otras funciones. 
		\item Conjunto de libreras Boost.Python para la comunicación de funciones Python a C++: estas librera permitirán crear los plugins en lenguaje Python y traducirlo a instrucciones en C++.	
		\item XML: Para el manejo de instrucciones de XML en C++ utilizaremos FXP (de FuDePAN).
		\item QT: desarrollo de la interfaz gráfica.
		\end{enumerate}
		
	\subsection{Características del Usuario:}
	Definimos para este sistema tres tipos de usuarios:
		\begin{itemize}
		\item Final: este será el médico u otro profesional que utilice la aplicación en forma definitiva. Deber cargar los parámetros necesarios y ejecutar el programa para luego visualizar los resultados. Para esto solo se requiere interactuar con la interfaz gráfica.
		\item De Extensiones: para este caso, el usuario con conocimientos amplios en el campo de la biología deber poder diseñar sus propias funciones en forma de plugins y sólo eso sin afectar la estructura interna del sistema.
		\item Desarrollador: para este rol el usuario debe poseer conocimientos específicos en programación ya que ser el encargado de ampliar el sistema por dentro. Es decir, de extender la funcionalidad del motor ampliándolo o mejorando algoritmos utilizados.También hay que tener en cuenta que luego de extender el sistema se debe realizar un testing con el objetivo de garantizar el buen funcionamiento del mismo.
		\end{itemize}
     
\section{Requerimientos Específicos}

	\subsection{Interfaz de Software:}
	Para la ejecución del sistema ser necesaria una plataforma Linux/UNIX, con las correspondientes dependencias necesarias para ejecutar Python y QT.
	
	\subsection{Interfaz Gráfica:}
	Esquematizamos una posible interfaz gráfica para el sistema. Esta no ser definitiva pero ayuda a la comprensión de los casos de Uso. Las figuras 4 y 5 muestran su posible diseño.
		
	\begin{figure}
  	\centering
    \includegraphics{GUI1.jpg}
  	\caption{Pantalla Principal}	
    \includegraphics{GUI2.jpg}
  	\caption{Pantalla de Plugins}
	\end{figure}

	\subsection{Requerimientos funcionales.}
	A continuación se muestran los requerimientos funcionales del sistema en forma evolutiva, es decir, como fueron cambiando estos requerimientos a lo largo del proyecto.
	
%--------------------------------------------------------------------------------------------------------------
	\subsection{Etapa Inicial:}
Primera aproximación al problema y los requerimientos del usuario.

\begin{itemize}

\item \textbf{Nombre del Requerimiento:} Codificación en Lenguaje C++ (RF1)\\
   	\textbf{Propósito:} Realizar la programación del sistema en lenguaje C++ con orientación a objetos. Esto fue requerido por parte de Fu.De.PAN siendo este el lenguaje estándar para la mayoría de sus proyectos por su performance, reusabilidad y extensión.\\   	


\item \textbf{Nombre del Requerimiento:} Carga de secuencia ARN del virus, base de datos de antirretrovirales y parámetros.(RF2)\\
   	\textbf{Propósito:} Cargar un archivo en formato FASTA, establecer los parámetros requeridos por el plugin.\\
   	\textbf{Input:} Archivo en formato FASTA, archivo de la base de datos, Valores de los parámetros requeridos por el plugin.\\
    \textbf{Procesamiento:} cargar el archivo y convertirlo a una estructura de datos adecuada para su manipulación. Un proceso similar los parámetros del plugin.\\
    \textbf{Output:} Estructura de datos asociada al archivo FASTA y estructura de datos con los parámetros.\\
	\textbf{Descripción:} El usuario carga el archivo haciendo click en el botón Examinar.
                   Si el formato no es correcto se muestra un mensaje de error.
                   Se configuran los parámetros.
                   Si los parámetros están en formato inadecuado o son inconsistentes se muestra un mensaje de error.
                   Se hace click en Procesar.
                   
                   
\item \textbf{Nombre del Requerimiento:} Conversión de una cadena de Pseudo-Nucleótidos a una cadena de Nucleótidos (RF3).\\
	\textbf{Propósito:} Algunos resultados obtenidos de laboratorio del procesamiento de las cadenas de ARN contienen pseudo-nucleótidos que no son realmente nucleótidos si no comodines que representan dos o más, por eso se debe convertir de acuerdo a una serie e reglas en una cadena de nucleótidos.\\
	\textbf{Input:} Cadena de Pseudo-Nucleótidos\\
	\textbf{Procesamiento:} Desarrollar todas las posibles variantes que puede tomar un pseudo-Nucleótido correspondiente a cada Nucleótido y generar las posibles cadenas de nucleótidos.\\
	\textbf{Output:} Cadena de nucleótidos.\\
	               
	               
\item \textbf{Nombre del Requerimiento:} Traducción a cadenas de Aminoácidos (RF4).\\
	\textbf{Propósito:} Convertir la secuencia de Nucleótidos a una secuencia de Aminoácidos (o Proteína) basado en reglas establecidas.\\
	\textbf{Input:} Cadena de Nucleótidos.\\
	\textbf{Procesamiento:} Tomando la cadena de nucleótidos de a tres caracteres convertimos este triplete en una proteína y repetimos el proceso hasta completar la totalidad basándonos en la Tabla de Código genético estándar.\\
	\textbf{Output:} Cadena de Aminoácidos.\\
                  
                  
\item \textbf{Nombre del Requerimiento:} Verificar que antirretroviral Aplica (RF5).\\
	\textbf{Propósito:} Verificar los antirretrovirales que tienen efectos sobre el virus para descartar los innecesarios.\\
	\textbf{Input:} Cadena de Aminoácidos, Base de Datos de antirretrovirales.\\
	\textbf{Procesamiento:} Compara cada antirretroviral con las secuencias a las cuales son aplicables y los que no corresponden a esta, son descartados.\\
	\textbf{Output:} Conjunto de antirretrovirales que aplican a este virus inicial (cadena de proteínas).\\
                  

\item \textbf{Nombre del Requerimiento: }Administrador de Plugins (RF6).\\
	\textbf{Propósito:} Poder utilizar una serie de componentes o plugins para extender la funcionalidad del sistema.\\
	\textbf{Input:} Plugin\\
	\textbf{ Procesamiento: }Carga del plugin.\\
	\textbf{Output:} Mensaje de Error o mostrar parámetros requeridos por el plugin en la GUI.\\
	\textbf{Descripción:} Se selecciona la opción Examinar para buscar el plugin y se da Aceptar.
	Si el plugin es un formato incorrecto se muestra un mensaje de error. Si el plugin es inconsistente con la Base de Datos de antirretrovirales se muestra un mensaje de error.
	En caso contrario se muestran las opciones de configuración del plugin\\
	
	\begin{enumerate}		
	\item \textbf{Nombre del Sub Requerimiento:} Chequear la consistencia del plugin con la Base de Datos(RF6.1).\\
		\textbf{Propósito:} Poder comprobar que el plugin sea consistente con los datos para evitar cálculos erróneos.\\
		\textbf{Input:} Plugin.\\
		\textbf{ Procesamiento:} el plugin tiene acceso a una versión de solo lectura de la BD y hace una pre evaluación de estos.\\
		\textbf{Output:} Mensaje de éxito o fracaso.\\		
		
	\item \textbf{Nombre del Sub Requerimiento:} configurar lista de parámetros requeridos(RF6.2).\\
		\textbf{Propósito:} Permitirle al plugin acceder a datos en tiempo de ejecución.\\
		\textbf{Input:} Plugin.\\
		\textbf{ Procesamiento:El Administrador solicita al plugin aquellos parámetros necesarios para hacer los cálculos. Estos son mostrados al usuario a travéz de la GUI, inicializados por este y retornados al plugin.}\\
		\textbf{Output:} Mensaje de éxito o fracaso en caso de errores en los valores establecidos por el usuario.\\
				
	\item \textbf{Nombre del Sub Requerimiento:} Adaptar el sistema de acuerdo a las modificaciones planteadas por el plugin (RF6.3).\\
		\textbf{Propósito:} Permitirle al implementador de plugin establecer los algoritmo mas eficiente y adaptaciones necesarias para mejorar el desempeño del sistema y adecuarlo a sus requerimientos.\\
		\textbf{Input:} Plugin.\\
		\textbf{ Procesamiento:} adaptar cada funcionalidad del plugin sobre el sistema\\
		\textbf{Output:} Mensaje de éxito o fracaso.\\
	\end{enumerate}
		
		
\item \textbf{Nombre del Requerimiento: } Funcionalidades del Plugin (RF7).\\
	\textbf{Propósito:} definir las capacidades del plugin y sus efectos sobre el sistema.\\

	\begin{enumerate}		
	\item \textbf{Nombre del Sub Requerimiento:} Algoritmo de generación (RF7.1).\\
		\textbf{Propósito:} Permitirle al usuario establecer el algoritmo más adecuado para construir el espacio de búsqueda.\\

	\item \textbf{Nombre del Sub Requerimiento:} Función de puntuación de terapias (RF7.2).\\
		\textbf{Propósito:} Proveer una función de puntuación (scoring), la cual recibía una terapia y retornaba un valor.\\
			  	
	\item \textbf{Nombre del Sub Requerimiento:} Función de poda (RF7.3).\\
		\textbf{Propósito:} proveer una función de poda del espacio de búsqueda la cual determinaba si continuar o no con una terapia.\\
			  
	\item \textbf{Nombre del Sub Requerimiento:} Validación de base de Datos. (RF7.4).\\
		\textbf{Propósito:} proveer una función que valide la base de datos con la que va a trabajar.\\
		
	\item \textbf{Nombre del Sub Requerimiento:} Configuración de Matriz de distancia. (RF7.5).\\
		\textbf{Propósito:} permitir establecer las distancias entre el nucleótido original y el nucleótido mutado.(¿ aclarar que tipo de distancia?)
	\end{enumerate}	
		
\item \textbf{Nombre del Requerimiento:} Generador de árbol de terapias (RF8).\\
    \textbf{Propósito:} Construir un árbol cuya raíz sea la secuencia inicial del virus. Además, construye cada nivel con las mutantes obtenidas luego de aplicar un conjunto de antirretrovirales. Una terapia debe crecer hasta que no queden antirretrovirales por aplicar, se haya encontrado una cepa resistente a todos o el plugin a través de la función de poda decida no continuarla.\\
	\textbf{Input:} Cadena de Aminoácidos (secuencia viral inicial), conjunto de antirretrovirales que aplican a la secuencia, función de poda introducida por el plugin y algoritmo de generación propuesto por este.\\
	\textbf{Procesamiento:} dada una cepa, analizamos los antirretrovirales que son efectivos contra esta, los agrupamos y aplicamos. Se crean nodos nuevos por cada mutante del virus, seleccionamos aquella de menor distancia evolutiva (menor distancia con la cepa del nodo padre). Repetimos este proceso de acuerdo a lo establecido por el algoritmo de generación hasta que no se puedan continuar más terapias.\\
	\textbf{ Output:} Árbol de terapias. \\


\item \textbf{Nombre del Requerimiento:} Ranking de Terapias (RF9).\\
	\textbf{Propósito:} establecer el conjunto de terapias optimas para abordar cepa inicial.\\
	\textbf{Input:} árbol de terapias, función de Scoring introducida por el plugin.\\
	\textbf{ Procesamiento:} Se recorre el árbol utilizando un algoritmo establecido por el plugin y se selecciona las aplicaciones de antirretrovirales más eficientes, de acuerdo a la función de scoring.\\
		\textbf{Output:} Listado ordenado de Terapias.\\
                  
                  
\item \textbf{Nombre del Requerimiento:} Muestra de los Resultados (RF10).\\
	\textbf{Propósito:} Mostrar en forma adecuada y clara los resultados calculados.\\
		\textbf{Input:} Listado de Terapias.\\
		\textbf{ Procesamiento:} Ordenar los resultados de las terapias por importancia. Presentarlos en forma de columnas o como salida de un archivo.
		\textbf{Output:} Listado de terapias.\\


\item \textbf{Nombre del Requerimiento:} Build system para construir plugins (RF11).\\
	\textbf{Propósito:} Proporcionarle al usuario facilidades para desarrollar plugins.\\
	\textbf{Input:} Archivo fuente.\\
	\textbf{ Procesamiento:} Compilar el archivo fuente y testearlo, retornando el plugin.\\
	\textbf{Output:} Plugin.\\
	
	
\item \textbf{Nombre del Requerimiento:} Plugin en phyton (RF12).
	\textbf{Propósito:} permitir la construcción de plugins en un lenguaje de fácil aprendizaje.\\
	
	
\item \textbf{Nombre del Requerimiento:} Combinador de Antirretrovirales (RF13).\\
	\textbf{Propósito:} Se busca emular el hecho de atacar al virus con cócteles de antirretrovirales.\\
	\textbf{Input:} conjunto de antirretrovirales que aplican al virus.\\
	\textbf{ Procesamiento:} generar todas las posibles combinaciones de tamaño entre N y M. Con N y M establecidas por el usuario.\\
	\textbf{Output:} Conjunto de conjuntos de antirretrovirales.\\
	
\end{itemize}

%--------------------------------------------------------------------------------------------------------------

\subsection{Etapa Media:}
En esta etapa se refinaron muchos de los requerimientos iniciales en base a una visión más acabada del problema.

\begin{itemize}
\item Se elimino el requerimiento RF3.
    	
\item Se elimino el requerimiento RF4.
    	
\item \textbf{Nombre del Requerimiento:} Plugin implementado sobre librerías dinámicas de C++ (RF12 versión 2).
	\textbf{Propósito:} Simplificar el sistema obviando la complejidad de relacionar dos lenguajes diferentes.\\
	
\item \textbf{Nombre del Requerimiento: } Funcionalidades del Plugin (RF7 versión 2).\\
	\textbf{Propósito:} Adaptar el requerimiento original para darle la libertad al plugin de proveer su propia política de generación. De esta forma no esta limitado a los algoritmos de generación que provee el SDK.
	
\item \textbf{Nombre del Requerimiento:} Ranking de Terapias (RF9 versión 2).\\
	\textbf{Propósito:} Notando la utilidad de este tipo de objetos se modifico el requerimiento original para que este sea un rankeador genérico de objetos.
	\textbf{Input:} objetos, función de comparación entre objetos y cantidad de elementos (top).\\
	\textbf{ Procesamiento:} a medida que se recibe un objeto se lo compara con los que están actualmente en el ranking. Luego se introduce en el ranking o se lo descarta.
	\textbf{Output:} Listado ordenado objetos.\\		
		
\item \textbf{Nombre del Requerimiento: }Librería para plugin - libplugin (RF11 versión 2).\\
	\textbf{Propósito:} Proveer un conjunto de librerías, con todo lo necesario para desarrollar un plugin en C++ y un constructor genérico de librerías dinámicas.\\
	\textbf{Propósito:} Proporcionarle al usuario facilidades para desarrollar plugins.\\
	\textbf{Input:} Archivo fuente (extensión $.cpp$).\\
	\textbf{ Procesamiento:} compilar el archivo fuente.\\
	\textbf{Output:} Librería dinámica de C++ (extensión $.so$).\\

\begin{enumerate}	
\item \textbf{Nombre del Sub Requerimiento:} Proveer una serie de algoritmos estándares de generación para el espacio de búsqueda (RF11.1).\\
	\textbf{Propósito:} Darle la posibilidad al implementador de plugin de contar con algoritmos básicos de generación.\\
	\textbf{Descripción:} proveer algoritmos de generación en profundidad, en anchura y el que solo considera las N mejores opciones en cada paso.			
\end{enumerate}	

\item \textbf{Nombre del Requerimiento:} Diseño orientado a observadores (RF14).\\
	\textbf{Propósito:} Generar terapias a medida que se procesan los Datos y Rankearlas a medida que se generan. De esta forma siempre tenemos las mejores terapias generadas hasta el momento. Logrando un sistema más robusto dados los recursos que consume la complejidad del calculo.\\

		\item \textbf{Nombre del Requerimiento:} Injerencia del plugin sobre los datos procesados, durante generación del espacio de búsqueda (RF15).\\
		\textbf{Propósito:} Darle mayor libertad al implementador del plugin para manejar tanta información como requiera durante la generación de terapias.\\
		
\end{itemize}

%--------------------------------------------------------------------------------------------------------------

\subsection{Etapa Final:}
Modificaciones acorde a requerimientos específicos de plugins generados por profesionales del dominio del problema.

\begin{itemize}
\item \textbf{Nombre del Requerimiento:} Múltiples algoritmos combinatiorios (RF16).\\
	\textbf{Propósito:} El sistema debe poder convivir con múltiples algoritmos para combinación de antirretrovirales.\\

\item \textbf{Nombre del Requerimiento: }Librería para plugin - libplugin (RF11 versión 3).\\

\begin{enumerate}	
\item \textbf{Nombre del Requerimiento:} Proveer una serie de algoritmos estándares para combinación  de antirretrovirales (RF11.2).\\
	\textbf{Propósito:} Proveer al implementador de plugin un conjunto de algoritmos de combinación pre diseñados para facilitar su tarea.\\
	\textbf{Descripción:} proveer algoritmos para combinación de antirretrovirales: combinación newtoneana, listador simple, secuencial de un grupo de combinadores, paralelo de un grupo de combinadores y combinador Vacío.		
\end{enumerate}	

\item \textbf{Nombre del Requerimiento: } Funcionalidades del Plugin (RF7 versión 3).\\
\begin{enumerate}	
		\item \textbf{Nombre del Sub Requerimiento:} Injerencia del plugin sobre la elección de algoritmos a aplicar en cada paso de las terapias generadas (RF7.6).\\
		\textbf{Propósito:} El plugin podría elegir algoritmos de scoring, poda y política combinatoria diferentes por cada paso de la generación de una terapia.\\
\end{enumerate}	

\end{itemize}

%--------------------------------------------------------------------------------------------------------------
	\subsection{Casos de Uso.}
		\begin{itemize}
		\item \textbf{Caso 1:} Carga de datos y configuración inicial
		\begin{itemize}
		\item \textbf{Subcaso 1.1} Carga de un archivo con una secuencia en formato FASTA.\\
		\textbf{Actor Primario:} Médico\\
		\textbf{Escenario principal exitoso:}
		\begin{enumerate}
		\item El médico presiona Examinar.
		\item El sistema despliega una ventana para seleccionar el archivo.
		\item El médico introduce un archivo con formato FASTA.
		\item El sistema acepta el archivo y lo procesa.
		\end{enumerate} 
		\textbf{Escenarios excepcionales:}\\
		- 3 a) El archivo ingresado no esta en formato FASTA.\\
		     * El sistema le indica al médico la situación.\\ 
		\item \textbf{Subcaso 1.2} Configurar la función de scoring.\\
		\textbf{Actor Primario:} Médico\\
		\textbf{Escenario principal exitoso:}
		\begin{enumerate}
		\item El médico configura los parámetros requeridos por la función de scoring y presiona OK.
		\item El sistema acepta los parámetros.
		\end{enumerate}
		\textbf{Escenarios excepcionales:}\\
		- 1 a) los parámetro ingresados son inconsistentes.\\
		     * El sistema le indica al médico la situación.\\ 
		    b) los parámetro están en formato no valido.\\
		     * El sistema le indica al médico la situación.\\ 
		    c) el médico no configura los parámetros y presiona OK.\\
		     * El sistema configura los parámetros a sus valores por default.\\  
		\end{itemize}
        \item \textbf{Caso 2:} Cargar un plugin\\
        \textbf{Actor Primario:} usuario avanzado\\
        \textbf{Escenario principal exitoso:}
        \begin{enumerate}
        \item El usuario avanzado presiona LOAD PLUGIN.
        \item El sistema despliega una ventana para seleccionar el plugin y presiona aceptar.
		\item El sistema carga el plugin y lo incorpora al sistema.        
        \end{enumerate}
        \textbf{Escenarios excepcionales:}\\
        3 a) El plugin no esta en el formato adecuado.\\
           * El sistema le indica al usuario avanzado la situación.\\ 
          b) El plugin es inconsistente con la BD de anti virales.\\
             * El sistema le indica al usuario avanzado la situación.\\
        %\item Caso 3: Crear un plugin
        \item \textbf{Caso 3:} Crear un plugin\\
        \textbf{Actor Primario:} usuario avanzado\\
        \textbf{Escenario principal exitoso:}
        \begin{enumerate}
        \item El usuario avanzado confecciona archivo fuente y presiona MAKE.
        \item El sistema construye el plugin y muestra mensaje de éxito.        
        \end{enumerate}
        \textbf{Escenarios excepcionales:}\\
        3 a) El archivo fuente no esta en el formato adecuado.\\
           * El sistema le indica al usuario la situación.\\ 
          b) El archivo fuente tiene errores (compilación).\\
             * El sistema le indica al usuario avanzado la situación.\\
		\end{itemize}
		
	\subsection{Atributos:}
		\begin{enumerate}
        \item Extensión del Software:
		Dado que este sistema es la implementación inicial de un motor combinatorio y de recorrida,	el cual también genera un árbol de decisión y lo recorre debemos tener en cuenta que este ser extendido en un futuro y ampliado en cuanto a sus funcionalidades para darle otros usos similares.La extensión de este sistema se enfoca en dos partes:
        \begin{itemize}
		\item Extensión Interna: como ya se menciono, el sistema ser extendido para mejorar la eficiencia o ampliar la funcionalidad. Esta tarea debe ser llevada a cabo por programadores o personas con entendimiento en el lenguaje y las metodologías utilizadas para desarrollar esta aplicación inicial.
		\item Extensión Externa: se agregó como parte del sistema, un administrador de plugins. La 	idea, como ya se describió con anterioridad, es proporcionar una forma de que personas con más conocimiento en el tema biológico modelen sus propias funciones as lograr un sistema ms acorde a las necesidades del profesional. Los plugins deberán ser en un lenguaje fácil de manejar, como por ejemplo, Python, utilizado actualmente por biólogos.
		\end{itemize}        
       	\end{enumerate}   		
	
\section{Apéndice}
	\subsection{Manejo de Cadenas:}
	Para la manipulación de los datos utilizaremos cadenas de caracteres que 
	representan tanto cadenas de ARN o ADN para representar génes como nucleótidos.
	Tanto el ADN como el ARN son la base del diseño del sistema biológico.
      
	\begin{itemize}
	\item $nuc\_arn = a \vert u \vert c \vert g \vert \_$
	\item $gen\_arn = (nuc\_arn)^{+}$
	\item $nuc\_adn = a \vert t \vert c \vert g \vert \_$
	\item $gen\_adn = (nuc\_adn)^{+}$	
	\end{itemize}
	
	Luego tenemos cadenas más complejas que son lo aminoácidos y las proteínas. Esta estructura es la base de la construcción biológica.
	
	\begin{itemize}
	\item $aminoacido = Ala \vert Arg \vert Asn ...$
	\item $proteina = aminoacido (aminoacido)^{+}$
	\end{itemize}

\end{document}